#include "USART1.h"



//BaudRate = 9600  115200
void USART1_Init(uint32_t BaudRate)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//GPIOA在APB2总线上
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//串口1在APB2总线上
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	//串口属于复用功能，要开启复用时钟
	
	GPIO_InitTypeDef  GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef  NVIC_InitStructure;
	
	//PA9 TXD配置
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;	//配置复用推挽输出！
	GPIO_InitStructure.GPIO_Pin   = TXD;	//output
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(USART_PORT, &GPIO_InitStructure);
	
	//PA10 RXD配置
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;	//上拉输入 或 浮空输入 都行
	GPIO_InitStructure.GPIO_Pin   = RXD;	//input
	//不需要输出速率
	GPIO_Init(USART_PORT, &GPIO_InitStructure);
	
	USART_DeInit(USART1);//先初始化一下
	USART_InitStructure.USART_BaudRate = BaudRate;//波特率设置 由形参传入
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位 1位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位 8位
	USART_InitStructure.USART_Parity = USART_Parity_No;//校验位 不使用奇偶校验
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用硬件流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//模式配置：发送和接收
	USART_Init(USART1, &USART_InitStructure);
	
	USART_ClearFlag(USART1, USART_FLAG_TXE);//开启中断之前，要先清空一下中断标志位
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//接收数据
	USART_Cmd(USART1, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);	//中断优先级分组
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;	//中断入口
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	//只有一个中断，这两个还是随便写，没有冲突
	NVIC_Init(&NVIC_InitStructure);
}


int fputc(int Data, FILE *BUF)
{
	USART_SendData(USART1, Data);//串口1发送数据Data
//	while ( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//USART_FLAG_TC标志位 运行不稳定
//	如果==0，就一直在这循环等待，直到等于1才跳出循环，这个标志位是1的时候，代表发送完成了	
	while ( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);		

	return Data;
}




void USART1_IRQHandler (void)
{
	//判断中断是否进入 (只要不等于0，就说明产生中断事件了)
	if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET )
	{
		USART_SendData(USART1, USART_ReceiveData(USART1));//发送数据，发送串口1接收的数据
		
		//清除中断事件
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
		
		//如果==0，就一直在这循环等待，直到等于1才跳出循环，这个标志位是1的时候，代表发送完成了
		//while ( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//USART_FLAG_TC标志位 运行不稳定
		while ( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);		
	}
}



/***********************************END OF FILE***********************************/
